package com.example.myspringboot.test;

import org.junit.jupiter.api.Test;
import java.util.concurrent.*;

public class testThreadDemo {

    // 假设有20张票
    private volatile static int tickets = 20;

    @Test
    public synchronized void testThreads() {
        // 为了保持票数的一致，票数要静态
        int tick = 110;
        //返回一个用于创建与当前线程具有相同权限的新线程的线程工厂。
        ThreadFactory threadFactory = Executors.defaultThreadFactory();
        //拒绝执行处理器
        //AbortPolicy（默认）：当工作队列已满并且无法再添加新任务时，抛出RejectedExecutionException异常。
        //CallerRunsPolicy：当工作队列已满并且无法再添加新任务时，由提交任务的线程来执行该任务。也就是说，任务将在提交线程的上下文中执行。
        //DiscardOldestPolicy：当工作队列已满并且无法再添加新任务时，丢弃队列中最早的任务（即等待时间最长的任务），然后尝试重新提交新任务。
        //DiscardPolicy：当工作队列已满并且无法再添加新任务时，直接丢弃新任务，不做任何处理。
        RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 10, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10), threadFactory, handler);
        for(int i = 0; i <= tick; i++) {
            threadPool.execute(testThreadDemo::sellTicket);
        }
    }

    // 售票方法
    private synchronized static void sellTicket() {
        if (tickets-- <= 0) {
            System.out.println("票已售完");
            return;
        }
        System.out.println("售出一张票，剩余票数：" + tickets);
    }
}
